#include<bits/stdc++.h>
// #define int long long
using namespace std;
const int N=1e6+5;
int T,n,m,l,v,b[N];
struct node{
    int d,d2;
    int v,a;
    bool flag=0;
}a[N];
bool cmp(node a,node b){
    return a.d<b.d;
}
signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    //freopen("detect.in","r",stdin);
    //freopen("detect.out","w",stdout);
    //freeopen("detect.in","r",stdin);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--){
        cin>>n>>m>>l>>v;
        int f=0,f1=INT_MAX,f3=INT_MIN;
        for(int i=1;i<=n;i++)cin>>a[i].d>>a[i].v>>a[i].a,f=max(f,a[i].a),f1=min(f1,a[i].a),f3=max(f3,a[i].a);
        for(int i=1;i<=m;i++)cin>>b[i];
        if(f==0){
            sort(a+1,a+n+1,cmp);
            int tot=0;
            for(int i=1;i<=n;i++)
                if(a[i].v>v&&b[m]>=a[i].d)
                    tot++;
            cout<<tot<<" ";
            if(!tot)cout<<m<<endl;
            else cout<<max(m-1,1)<<endl;
            continue;
        }
        if(f1>=0){
            for(int i=1;i<=n;i++){
                int v0=a[i].v,aa=a[i].a;
                if(v0<v&&aa){
                    if((v*v-v0*v0)%(2*aa)==0)a[i].flag=1;
                    a[i].d=a[i].d+(v*v-v0*v0)/(2*aa);
                }
            }
            int tot=0;
            for(int i=1;i<=n;i++){
                if((a[i].a||a[i].v>v)&&b[m]>=a[i].d)
                    tot++;
                if(a[i].v==v&&b[m]==a[i].d&&a[i].a)tot--;
                if(a[i].flag&&a[i].d==b[m])tot--;
            }
            cout<<tot<<' ';
            if(!tot)cout<<m<<endl;
            else cout<<max(m-1,1)<<endl;
            continue;
        }
        // if(f3<0){
        //     for(int i=1;i<=n;i++){
        //         int v0=a[i].v,aa=a[i].a;
        //         if(v0>v&&aa<0){
        //             aa=-aa;
        //             if((v*v-v0*v0)%(2*aa)==0)a[i].flag=1;
        //             a[i].d2=a[i].d+(v*v-v0*v0)/(2*aa);
        //         }
        //     }
        //     int tot=0;
        //     for(int i=1;i<=n;i++){
        //         if(a[i].v<=v)continue;
        //         int f=0;
        //         for(int i=1;i<=m;i++){
        //             if(b[m]>=a[i].d&&b[m]<a[i].d2){
        //                 f=1;
        //             }
        //             if(b[m]==a[i].d2&&!a[i].flag)f=1;
        //         }
        //         tot+=f;
        //     }
        //     cout<<tot<<' ';
        //     cout<<endl;
        // }
        cout<<n-2<<' '<<m-2<<endl;
    }
    return 0;
}
/*
PHO
&&&
OI
nitian
*/